package com.wei.czz.framework.admin.controller;

import com.wei.czz.common.annotation.Auth;
import com.wei.czz.common.annotation.AuthLogin;
import com.wei.czz.common.annotation.Resubmit;
import com.wei.czz.common.dto.admin.PoetryDto;
import com.wei.czz.common.enums.ResultEnum;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.utils.SecurityUtils;
import com.wei.czz.common.vo.common.PoetryVo;
import com.wei.czz.framework.admin.service.PoetryService;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2021-06-07 15:51:00
 * className: PoetryController 用户诗意文字操作请求接口类
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("sys/poetry")
@AllArgsConstructor
public class PoetryController {

    private static final Logger log = LoggerFactory.getLogger(PoetryController.class);

    private final PoetryService poetryService;


    /**
     * 保存用户诗意信息接口
     *
     * 调用方：
     *  1、浏览器-后台管理页面-诗意文字管理页面调用
     *
     * 此接口会校验是否重复提交
     * @param poetryVo 诗意文字信息对象
     */
    @Resubmit(message = "保存诗意文字信息")
    @PostMapping("/save")
    @Auth(permit = "poem:add")
    public Result<Object> savePoetry(@RequestBody PoetryVo poetryVo) {
        log.info("开始用户诗意文字信息保存业务。{}", poetryVo);

        if (StringUtils.isBlank(poetryVo.getTitle()) || poetryVo.getVertical() == null || poetryVo.getUseFlag() == null
            || poetryVo.getDataList() == null || poetryVo.getDataList().isEmpty()) {
            log.info("保存用户诗意信息接口请求参数错误");
            return Result.paramFail();
        }

        poetryService.savePoetry(poetryVo);

        log.info("用户诗意文字信息保存业务结束");
        return Result.success();
    }

    /**
     * 分页获取用户诗意文字列表接口
     *
     * 调用方：
     *  1、浏览器-后台管理页面-诗意文字管理页面调用
     * @param page  当前页码
     * @param limit 当前页显示个数
     */
    @GetMapping("/list")
    @Auth(permit = "poem:list")
    public Result<Map<String, Object>> getPoetryList(@RequestParam("page") Long page,
                                                     @RequestParam("limit") Long limit) {
        log.info("开始查询用户诗意文字列表业务。page={} limit={}", page, limit);

        // 异步查询用户是否使用的诗意信息
        Future<Boolean> future = poetryService.getUseFlagInPoetryOnAsync(SecurityUtils.getUserId());
        // 主业务
        PageDto<PoetryDto> pageDto = poetryService.getPoetryList(page, limit);

        Boolean useFlag;
        try {
            useFlag = future.get();
        } catch (InterruptedException | ExecutionException e) {
            log.error("异步查询用户是否使用的诗意信息失败。message={}", e.getMessage(), e);
            return Result.getResult(ResultEnum.REQUEST_FAIL.getCode(), "查询用户诗意文字列表失败，请联系管理员处理。");
        }

        log.info("查询用户诗意文字列表业务结束");
        Map<String, Object> data = new HashMap<>();
        data.put("page", pageDto);
        data.put("useFlag", useFlag);
        return Result.success(data);
    }

    /**
     * 获取用户使用的诗意文字信息接口
     *
     * 调用方：
     *  1、浏览器-浏览器页面-首页面调用
     */
    @GetMapping("/info")
    @Auth(permit = "poem:info")
    public Result<PoetryDto> getUserPoetry() {
        log.info("开始查询用户设置使用的诗意文字信息业务");

        PoetryDto poetryDto = poetryService.getUsePoetryInfo(SecurityUtils.getUserId());

        log.info("查询用户设置使用的诗意文字信息业务结束");
        return Result.success(poetryDto);
    }

    /**
     * 修改用户诗意文字信息接口
     *
     * 调用方：
     *  1、浏览器-后台管理页面-诗意文字管理页面调用
     *
     * 此接口会校验是否重复提交
     * @param poetryVo 诗意文字信息对象
     */
    @Resubmit(message = "修改诗意文字信息")
    @PostMapping("/update")
    @Auth(permit = "poem:update")
    public Result<Object> updatePoetry(@RequestBody PoetryVo poetryVo) {
        log.info("开始用户诗意信息修改业务。{}", poetryVo);

        if (StringUtils.isBlank(poetryVo.getPoetryId()) || StringUtils.isBlank(poetryVo.getTitle())
            || poetryVo.getVertical() == null || poetryVo.getUseFlag() == null
            || poetryVo.getDataList() == null || poetryVo.getDataList().isEmpty()) {
            log.info("修改用户诗意文字信息接口请求参数错误");
            return Result.paramFail();
        }

        poetryService.updatePoetry(poetryVo);

        log.info("用户诗意信息修改业务结束");
        return Result.success();
    }

    /**
     * 用户设置并使用诗意信息接口
     * 根据用户诗意信息主键，设置该用户诗意信息为用户首页显示的诗意信息
     *
     * 调用方：
     *  1、浏览器-后台管理页面-诗意文字管理页面调用
     *
     * 此接口会校验是否重复提交
     * @param poetryId 用户诗意信息主键
     */
    @Resubmit(message = "使用诗意文字")
    @GetMapping("/using")
    @AuthLogin
    public Result<Object> usingPoetry(@RequestParam("poetryId") String poetryId) {
        log.info("开始用户设置使用诗意信息业务。poetryId={}", poetryId);

        if (StringUtils.isBlank(poetryId)) {
            log.info("用户设置并使用诗意信息接口请求参数错误");
            return Result.paramFail();
        }

        poetryService.usingPoetry(poetryId);

        log.info("用户设置使用诗意文字业务结束");
        return Result.success();
    }

    /**
     * 用户取消使用诗意信息接口
     *
     * 调用方：
     *  1、浏览器-后台管理页面-诗意文字管理页面调用
     *
     * 此接口会校验是否重复提交
     * @param poetryId 用户诗意信息主键
     */
    @Resubmit(message = "取消使用诗意文字")
    @GetMapping("/cancel/using")
    @AuthLogin
    public Result<Object> cancelUsingPoetry(@RequestParam("poetryId") String poetryId) {
        log.info("开始用户取消使用诗意文字业务。poetryId={}", poetryId);

        if (StringUtils.isBlank(poetryId)) {
            log.info("用户取消使用诗意信息接口请求参数错误");
            return Result.paramFail();
        }

        poetryService.cancelUsingPoetry(poetryId);

        log.info("用户取消使用诗意文字业务结束");
        return Result.success();
    }

    /**
     * 用户删除诗意信息接口
     *
     * 调用方：
     *  1、浏览器-后台管理页面-诗意文字管理页面调用
     *
     * 此接口会校验是否重复提交
     * @param poetryId 用户诗意信息主键
     */
    @Resubmit(message = "删除诗意文字信息")
    @DeleteMapping("/delete")
    @AuthLogin
    public Result<Object> deletePoetry(@RequestParam("poetryId") String poetryId) {
        log.info("开始用户删除自己的诗意文字信息业务。poetryId={}", poetryId);

        if (StringUtils.isBlank(poetryId)) {
            log.info("用户删除诗意信息接口请求参数错误");
            return Result.paramFail();
        }

        poetryService.deletePoetry(poetryId);

        log.info("用户删除自己的诗意文字信息业务结束");
        return Result.success();
    }

}
